#include <iostream>
#include <sstream>
#include <string>
#include <memory>
#include <jsoncpp/json/json.h>

//使用jsoncpp库进行多个对象的序列化
std::string serialize()
{
    //1.将需要序列化的多个对象存储在一个json::value中
    Json::Value root;
    root["姓名"]="小明";
    root["年龄"]=18;
    root["性别"]="男";
    root["成绩"].append(90);
    root["成绩"].append(80);
    root["成绩"].append(70);
    //2.实例化一个StreamWriterBuilder对象
    Json::StreamWriterBuilder swb;
    swb["emitUTF8"] = true;//设置输出为utf-8编码,不设置默认输出为ascii编码
    //3.使用StreamWriterBuilder对象创建一个StreamWriter对象
    Json::StreamWriter *sw=swb.newStreamWriter();
    //4.使用StreamWriter对象将json::value对象序列化为字符串
    std::stringstream ss;
    int ret=sw->write(root,&ss);
    if(ret!=0)
    {
        std::cout<<"序列化失败"<<std::endl;
        return "";
    }
    std::cout<<ss.str()<<std::endl;
    delete sw;
    return ss.str();
}
//使用jsoncpp库进行多个对象的反序列化
std::string unserialize(std::string &str)
{
    //1.实例化一个CharReaderBuilder工厂类对象
    Json::CharReaderBuilder crb;
    //2.使用CharReaderBuilder对象创建一个CharReader对象
    Json::CharReader *cr=crb.newCharReader();
    //3.定义一个Josn::Value对象存储解析后的数据
    Json::Value root;
    //4.使用charReader对象进行Josn格式字符串的反序列化
    bool ret=cr->parse(str.c_str(),str.c_str()+str.size(),&root,nullptr);
    if(!ret)
    {
        std::cout<<"反序列化失败"<<std::endl;
        return "";
    }
    //5.逐个元素去访问Json::Value中的数据
    std::cout<<"姓名:"<<root["姓名"].asString()<<std::endl;
    std::cout<<"年龄:"<<root["年龄"].asInt()<<std::endl;
    std::cout<<"性别:"<<root["性别"].asString()<<std::endl;
    std::cout<<"成绩:"<<std::endl;
    for(int i=0;i<root["成绩"].size();i++)
    {
        std::cout<<root["成绩"][i].asInt()<<std::endl;
    }
    delete cr;
    return "";
}


int main()
{
    std::string str=serialize();
    std::cout<<unserialize(str)<<std::endl;
}

